home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / sbin / mkinitramfs < prev    next >
Text File  |  2008-07-16  |  7KB  |  313 lines

  1. #!/bin/sh
  2.  
  3. umask 0022
  4. export PATH='/usr/bin:/sbin:/bin'
  5.  
  6. # Defaults
  7. keep="n"
  8. CONFDIR="/etc/initramfs-tools"
  9. verbose="n"
  10. errors_to="2>/dev/null"
  11. BUSYBOXDIR="/usr/lib/initramfs-tools/bin/"
  12. # BUSYBOXDIR="/bin"
  13.  
  14. OPTIONS=`getopt -o d:ko:r:v --long supported-host-version:,supported-target-version: -n "$0" -- "$@"`
  15.  
  16. # Check for non-GNU getopt
  17. if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
  18.  
  19. eval set -- "$OPTIONS"
  20.  
  21. while true; do
  22.     case "$1" in
  23.     -d)
  24.         CONFDIR="$2"
  25.         shift 2
  26.         if [ ! -d "${CONFDIR}" ]; then
  27.             echo "${0}: ${CONFDIR}: Not a directory" >&2
  28.             exit 1
  29.         fi
  30.         ;;
  31.     -o)
  32.         outfile="$2"
  33.         shift 2
  34.         ;;
  35.     -k)
  36.         keep="y"
  37.         shift
  38.         ;;
  39.     -r)
  40.         ROOT="$2"
  41.         shift 2
  42.         ;;
  43.     -v)
  44.         verbose="y"
  45.         shift
  46.         ;;
  47.     --supported-host-version)
  48.         supported_host_version="$2"
  49.         shift 2
  50.         ;;
  51.     --supported-target-version)
  52.         supported_target_version="$2"
  53.         shift 2
  54.         ;;
  55.     --)
  56.         shift
  57.         break
  58.         ;;
  59.     *)
  60.         echo "Internal error!" >&2
  61.         exit 1
  62.         ;;
  63.     esac
  64. done
  65.  
  66. # FIXME: remove after Lenny (needed for Etch linux-images)
  67. if [ -n "$supported_host_version" ] || [ -n "$supported_target_version" ]; then
  68.     if [ -n "$supported_host_version" ]; then
  69.         host_upstream_version="${supported_host_version%%-*}"
  70.     fi
  71.     if [ -n "$supported_target_version" ]; then
  72.         target_upstream_version="${supported_target_version%%-*}"
  73.         if dpkg --compare-versions "$target_upstream_version" lt "2.6.12"; then
  74.             exit 2
  75.         fi
  76.     fi
  77.     echo "Depreciation warning: use ramdisk=mkinitramfs-kpkg."
  78.     exit 0
  79. fi
  80.  
  81. # For dependency ordered mkinitramfs hook scripts.
  82. . /usr/share/initramfs-tools/scripts/functions
  83. . /usr/share/initramfs-tools/hook-functions
  84.  
  85. . "${CONFDIR}/initramfs.conf"
  86. EXTRA_CONF=''
  87. for i in /usr/share/initramfs-tools/conf.d/* ${CONFDIR}/conf.d/*; do
  88.     EXTRA_CONF="${EXTRA_CONF} $(basename $i \
  89.         | grep '^[[:alnum:]][[:alnum:]\._-]*$' | grep -v '\.dpkg-.*$')";
  90. done
  91. # FIXME: deprecated those settings on mkinitramfs run
  92. #        these conf dirs are for boot scripts and land on initramfs
  93. for i in ${EXTRA_CONF}; do
  94.     if [ -e  ${CONFDIR}/conf.d/${i} ]; then
  95.         . ${CONFDIR}/conf.d/${i}
  96.     elif [ -e  /usr/share/initramfs-tools/conf.d/${i} ]; then
  97.         . /usr/share/initramfs-tools/conf.d/${i}
  98.     fi
  99. done
  100.  
  101. # source package confs
  102. for i in /usr/share/initramfs-tools/conf-hooks.d/*; do
  103.     if [ -e "${i}" ]; then
  104.         . "${i}"
  105.     fi
  106. done
  107.  
  108. if [ -n "${UMASK}" ]; then
  109.     umask "${UMASK}"
  110. fi
  111.  
  112. if [ -z "${outfile}" ]; then
  113.     usage
  114. fi
  115.  
  116. touch "$outfile"
  117. outfile="$(readlink -f "$outfile")"
  118.  
  119. # And by "version" we really mean path to kernel modules
  120. # This is braindead, and exists to preserve the interface with mkinitrd
  121. if [ ${#} -ne 1 ]; then
  122.     version="$(uname -r)"
  123. else
  124.     version="${1}"
  125. fi
  126.  
  127. # Check that we're using a new enough kernel version, first for ourselves,
  128. # then for each of the hooks, which can have a MINKVER variable defined
  129. check_minkver ${version}
  130. check_minkver ${version} /usr/share/initramfs-tools/hooks
  131. check_minkver ${version} ${CONFDIR}/hooks
  132.  
  133. case "${version}" in
  134. /lib/modules/*/[!/]*)
  135.     ;;
  136. /lib/modules/[!/]*)
  137.     version="${version#/lib/modules/}"
  138.     version="${version%%/*}"
  139.     ;;
  140. esac
  141.  
  142. case "${version}" in
  143. */*)
  144.     echo "$PROG: ${version} is not a valid kernel version" >&2
  145.     exit 1
  146.     ;;
  147. esac
  148.  
  149. if [ -d "${outfile}" ]; then
  150.     echo "${outfile} is a directory"
  151.     exit 1
  152. fi
  153.  
  154. MODULESDIR="/lib/modules/${version}"
  155.  
  156. if [ ! -e "${MODULESDIR}" ]; then
  157.     echo "Cannot find ${MODULESDIR}"
  158.     exit 1
  159. fi
  160. if [ ! -e "${MODULESDIR}/modules.dep" ]; then
  161.     depmod ${version}
  162. fi
  163.  
  164. DESTDIR="$(mktemp -t -d mkinitramfs_XXXXXX)" || exit 1
  165. __TMPCPIOGZ="$(mktemp -t mkinitramfs-OL_XXXXXX)" || exit 1
  166.  
  167. DPKG_ARCH=`dpkg --print-installation-architecture`
  168.  
  169. # Export environment for hook scripts.
  170. #
  171. export MODULESDIR
  172. export version
  173. export CONFDIR
  174. export DESTDIR
  175. export DPKG_ARCH
  176. export verbose
  177. export KEYMAP
  178. export MODULES
  179. export COMPCACHE_SIZE
  180.  
  181. # Private, used by 'catenate_cpiogz'.
  182. export __TMPCPIOGZ
  183.  
  184. for d in bin conf/conf.d etc lib/modules sbin scripts ${MODULESDIR}; do
  185.     mkdir -p "${DESTDIR}/${d}"
  186. done
  187.  
  188. # MODULES=list case.  Always honour.
  189. for x in "${CONFDIR}/modules" /usr/share/initramfs-tools/modules.d/*; do
  190.     if [ -f "${x}" ]; then
  191.         add_modules_from_file "${x}"
  192.     fi
  193. done
  194.  
  195. # MODULES=most is default
  196. case "${MODULES}" in
  197. dep)
  198.     dep_add_modules
  199.     ;;
  200. most)
  201.     auto_add_modules
  202.     ;;
  203. netboot)
  204.     auto_add_modules base
  205.     auto_add_modules net
  206.     ;;
  207. list)
  208.     # nothing to add
  209.     ;;
  210. *)
  211.     echo "mkinitramfs: Warning unsupported MODULES setting: ${MODULES}."
  212.     echo "mkinitramfs: Falling back to MODULES=most."
  213.     auto_add_modules
  214.     ;;
  215. esac
  216.  
  217. # Have to do each file, because cpio --dereference doesn't recurse down
  218. # symlinks.
  219.  
  220. # klibc
  221. ln -s /usr/lib/klibc/bin/* ${DESTDIR}/bin
  222. ln -s /lib/klibc-*.so ${DESTDIR}/lib
  223.  
  224. copy_exec /usr/share/initramfs-tools/init /init
  225.  
  226. # add existant boot scripts
  227. for b in $(cd /usr/share/initramfs-tools/scripts/ && find . \
  228.     -regextype posix-extended -regex '.*/[[:alnum:]_]+$' -type f); do
  229.     [ -d "${DESTDIR}/scripts/$(dirname "${b}")" ] \
  230.         || mkdir -p "${DESTDIR}/scripts/$(dirname "${b}")"
  231.     cp -p "/usr/share/initramfs-tools/scripts/${b}" \
  232.         "${DESTDIR}/scripts/$(dirname "${b}")/"
  233. done
  234. for b in $(cd "${CONFDIR}/scripts" && find . \
  235.     -regextype posix-extended -regex '.*/[[:alnum:]_]+$' -type f); do
  236.     [ -d "${DESTDIR}/scripts/$(dirname "${b}")" ] \
  237.         || mkdir -p "${DESTDIR}/scripts/$(dirname "${b}")"
  238.     cp -p "${CONFDIR}/scripts/${b}" "${DESTDIR}/scripts/$(dirname "${b}")/"
  239. done
  240.  
  241. echo "DPKG_ARCH=${DPKG_ARCH}" > ${DESTDIR}/conf/arch.conf
  242. copy_exec "${CONFDIR}/initramfs.conf" /conf
  243. for i in ${EXTRA_CONF}; do
  244.     if [ -e "${CONFDIR}/conf.d/${i}" ]; then
  245.         copy_exec "${CONFDIR}/conf.d/${i}" /conf/conf.d
  246.     elif [ -e "/usr/share/initramfs-tools/conf.d/${i}" ]; then
  247.         copy_exec "/usr/share/initramfs-tools/conf.d/${i}" /conf/conf.d
  248.     fi
  249. done
  250.  
  251. # ROOT hardcoding
  252. if [ -n "${ROOT}" ]; then
  253.     echo "ROOT=${ROOT}" > ${DESTDIR}/conf/conf.d/root
  254. fi
  255.  
  256. # Busybox
  257. if [ "${BUSYBOX}" = "n" ] || [ ! -e ${BUSYBOXDIR}/busybox ]; then
  258.     mv ${DESTDIR}/bin/sh.shared ${DESTDIR}/bin/sh
  259.     # those root need busybox
  260.     eval "$(mount | awk '/ \/ / {print "r_dev=" $1; exit}')"
  261.     if [ "${r_dev#/dev/mapper/}" != "${r_dev}" ] \
  262.         || [ "${r_dev#/dev/md}" != "${r_dev}" ]; then
  263.         echo "Warning: Busybox is required for successful boot!"
  264.     fi
  265. else
  266.     rm -f ${DESTDIR}/bin/sh
  267.     rm -f ${DESTDIR}/bin/busybox
  268.     copy_exec ${BUSYBOXDIR}/busybox /bin/busybox
  269.     ln -s ${BUSYBOXDIR}/busybox ${DESTDIR}/bin/sh
  270.     # klibc's version is just wrong; patch sent upstream by maks
  271.     rm -f ${DESTDIR}/bin/chroot
  272.     # klibc's version can't display mounts, which casper needs; fuse
  273.     # needs /bin/mount to exist, so add a symlink
  274.     rm -f ${DESTDIR}/bin/mount
  275.     ln -s busybox ${DESTDIR}/bin/mount
  276. fi
  277.  
  278. # Modutils
  279. copy_exec /sbin/modprobe /sbin
  280. copy_exec /sbin/depmod /sbin
  281. copy_exec /sbin/rmmod /sbin
  282. mkdir -p "${DESTDIR}/etc/modprobe.d"
  283. cp -a /etc/modprobe.d/* "${DESTDIR}/etc/modprobe.d/"
  284.  
  285. # workaround: libgcc always needed on old-abi arm
  286. if [ "$DPKG_ARCH" = arm ] || [ "$DPKG_ARCH" = armeb ]; then
  287.     cp -a /lib/libgcc_s.so.1 "${DESTDIR}/lib/"
  288. fi
  289.  
  290. run_scripts /usr/share/initramfs-tools/hooks
  291. run_scripts "${CONFDIR}"/hooks
  292.  
  293. # Apply DSDT to initramfs
  294. if [ -e "${CONFDIR}/DSDT.aml" ]; then
  295.     copy_exec "${CONFDIR}/DSDT.aml" /
  296. fi
  297.  
  298. [ "${verbose}" = y ] && echo "Building cpio ${outfile} initramfs"
  299. (cd "${DESTDIR}" && find . | cpio --quiet --dereference -o -H newc | gzip >"${outfile}") || exit 1
  300.  
  301. if [ -s "${__TMPCPIOGZ}" ]; then
  302.     cat "${__TMPCPIOGZ}" >>"${outfile}" || exit 1
  303. fi
  304.  
  305. if [ "${keep}" = "y" ]; then
  306.     echo "Working files in ${DESTDIR} and overlay in ${__TMPCPIOGZ}"
  307. else
  308.     rm -rf "${DESTDIR}"
  309.     rm -rf "${__TMPCPIOGZ}"
  310. fi
  311.  
  312. exit 0
  313.